﻿using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Configuration;


// connectionString="Data Source=POSEIDON;Initial Catalog=GestionRecaudos;Persist Security Info=True;User ID=sa;Password=CPvq3wvcy3"
// connectionString="Data Source=AWILCHES;Initial Catalog=GestionRecaudos;Persist Security Info=True;User ID=sa;Password=Alvaro86"

namespace GestionRecaudos
{
    public partial class INDEX : Form
    {
        //public GestionRecaudosDataSet.spSeguridadUsuarioDataTable DatosUsuario = new GestionRecaudosDataSet.spSeguridadUsuarioDataTable();
        public GestionRecaudosDataSet.spSeguridadUsuarioRow datosUsuario=null;

        public INDEX()
        {
            InitializeComponent();
        }

        private void inicio_Load(object sender, EventArgs e)
        {
            //--- elimino los ITEM que tenga el menu principal
            this.menuStrip.Items.Clear();

            //--- Verifico las conexiones.
            new FrmVerificarConexion().ShowDialog();

            //--- Coloco como titulo el nombre de la empresa
            this.Text = Utils.get().getValorParametro("NombreEmpresa");

            //--- Creo el ODBC Para las conexion de los reportes Crystal (Si aun no ha sido creado)
            try
            {
                System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
                builder.ConnectionString = ConfigurationManager.ConnectionStrings[Utils.get().getValorParametro("SeccionAppConfigGestionRecaudosConnectionString")].ConnectionString;
                ODBCManager.get().CreateDSN(
                        builder.InitialCatalog + "(" + builder.DataSource + ")"
                       , "Este DNS Creado Automaticamente por la aplicación \"" + Application.ProductName + "\""
                       , builder.DataSource
                       , "SQL SERVER"
                       , false
                       , builder.InitialCatalog
                       );
            }
            catch (Exception ex) 
            {
                //MessageException.show(ex);
                //ManageForms.closeAllForms();
                //return;
            }

            //--- registro este formulario en la lista...
            ManageForms.addNewForm(this);

            ////--- inicio sesion...
            if (!this.iniciarSesion())
            {
                ManageForms.closeAllForms();
                return;
            }

            this.Text = this.Text + " (" + this.datosUsuario.Login + ")";

            //--- Cargo los formularios a los que el usuario tenga acceso
            if (Utils.get().getValorParametro("CargarModulosAlIniciarAplicacion") == "SI")
            {
                new FrmCargarFormularios().ShowDialog();
            }

            //--- Cargo el Menu (La funcion es recursiva, por eso debo enviarle NULL en el parametro CodMenu)
            this.cargarMenu();
        }
        
        public bool iniciarSesion()
        {
            FrmLogin login = new FrmLogin();
            login.ShowDialog(this);
            if (login.DatosUsuario.Rows.Count.Equals(0))
            {
                return false;
            }
            this.datosUsuario = (GestionRecaudosDataSet.spSeguridadUsuarioRow)login.DatosUsuario.Rows[0];
            return true;
        }

        public void cargarMenu()
        {
            Cursor.Current = Cursors.WaitCursor;
            this.menuStrip.Items.Clear();
            this.cargarMenu(this.menuStrip, null, (Utils.get().getValorParametro("OcultarOpcionesMenuInvalidas") == "SI" ? true : false));
            Cursor.Current = Cursors.Default;
        }
                
        private void MenuItem_Click(object sender, EventArgs e)
        {            
            //--- Obtengo el formulario asociado al ITEM, se guardo en el campo TAG del item
            string formulario = ((ToolStripMenuItem)sender).Tag.ToString();

            //-- Verifico que tenga asociado un Formulario y que NO tenga Hijos
            if (formulario.Trim().Equals(string.Empty) || !((ToolStripMenuItem)sender).DropDownItems.Count.Equals(0))
            {
                return;
            }

            switch (formulario)
            {
                case "Cerrar Sesión":
                    {
                        if (Utils.get().getValorParametro("CrearBackUpAutomaticamenteAlCerrarApp") == "SI")
                        {
                            this.crearBackUp();
                        }

                        ManageForms.closeAllForms();
                        break;
                    }
                case "FrmShowTotalVendido":
                    {
                        ((FrmShowTotalVendido)ManageForms.getFormulario("FrmShowTotalVendido")).BloquearFechas = false;
                        ManageForms.open("FrmShowTotalVendido");
                        break;
                    }
                default:
                    {
                        try { ManageForms.open(formulario); }
                        catch (Exception ex) { MessageException.show(ex); }
                        break;
                    }
            }

        }

        private void cargarMenu(Object objeto, string CodMenu, Boolean OcultarOpcionesMenuInvalidas)
        {
            Cursor.Current = Cursors.WaitCursor;
            try
            {
                GestionRecaudosDataSet.spSeguridadMenuDataTable table = new GestionRecaudosDataSet.spSeguridadMenuDataTable();
                this.spSeguridadMenuTableAdapter1.FillBy(
                    table,
                    "SelectHijos",
                    null,
                    null,
                    null,
                    null,
                    CodMenu,
                    null,
                    null,
                    null,
                    null,
                    null,
                    null
                );

                foreach (GestionRecaudosDataSet.spSeguridadMenuRow row in table.Rows)
                {
                    ToolStripMenuItem temp = new ToolStripMenuItem();
                    temp.Name = row.Codigo.ToString();
                    temp.Text = row.etiqueta.ToString();
                    temp.Tag = (row.IsFormularioNull() ? string.Empty : row.Formulario.ToString());
                    temp.ToolTipText = row.descripcion.Trim();
                    temp.Image = (row.IsiconoNull() ? null : Image.FromStream(new MemoryStream(row.icono)));
                    temp.Enabled = row.MenuHabilitado;
                    temp.Click += new System.EventHandler(this.MenuItem_Click);
                    temp.Visible = (OcultarOpcionesMenuInvalidas && !row.MenuHabilitado ? false : true);

                    if (CodMenu==null)
                    {
                        ((MenuStrip)objeto).Items.Add(temp);
                    }
                    else
                    {
                        ((ToolStripMenuItem)objeto).DropDownItems.Add(temp);
                    }
                    this.cargarMenu(temp, row.Codigo, OcultarOpcionesMenuInvalidas);
                }
            }
            catch (Exception ex)
            {
                MessageException.show(ex);
                ManageForms.closeAllForms();
            }
        }

        private void INDEX_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("¿Desea Salir del Sistema?", "Confirmacion", MessageBoxButtons.YesNo) == DialogResult.No)
            {
                e.Cancel = true;
                return;
            }

            if (Utils.get().getValorParametro("CrearBackUpAutomaticamenteAlCerrarApp")=="SI")
            {
                this.crearBackUp();
            }
            

            ManageForms.closeAllForms();            
        }

        private void crearBackUp()
        {
            try
            {
                //--- elimino los ITEM que tenga el menu principal
                this.menuStrip.Items.Clear();
                
                //--- Agrego un nuevo Item que indique que se esta realizando una copia de seguridad
                this.menuStrip.Items.Add("CREANDO COPIA DE SEGURDAD, POR FAVOR ESPERE...");
                this.menuStrip.Refresh();

                Cursor.Current = Cursors.WaitCursor;
                System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
                builder.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings[Utils.get().getValorParametro("SeccionAppConfigGestionRecaudosConnectionString")].ConnectionString;
                //string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[Utils.get().getValorParametro("SeccionAppConfigGestionRecaudosConnectionString")].ConnectionString;
                DataTable table = new DataTable();
                using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(builder.ConnectionString))
                {
                    conn.Open();
                    System.Data.SqlClient.SqlCommand command = conn.CreateCommand();
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandText = "[spBackupBaseDatos]";
                    command.Parameters.Add(new System.Data.SqlClient.SqlParameter("@DirectorioDestino", Utils.get().getValorParametro("DirectorioBackUps")));
                    command.Parameters.Add(new System.Data.SqlClient.SqlParameter("@NombreBaseDatos", builder.InitialCatalog));
                    table.Load(command.ExecuteReader());
                    conn.Close();
                }
                //MessageBox.Show("La Copia de Seguridad se Realizo Satisfactoriamente!");
                //this.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("La copia de Seguridad No pudo realizarse, notifique Al Administrador del sistema.\n\nError:\n"+ex.Message);
                //MessageException.show(ex);
            }
        }
    }
}
